// 定位器生成函数 - 不立即执行
function generateLocators(elementInfo) {
    const info = JSON.parse(elementInfo);
    const locators = [];
    let priority = 0;

    /**
     * 添加定位器到列表
     */
    function addLocator(locator, type, reliability, description = '') {
        locators.push({
            locator: locator,
            type: type,
            priority: ++priority,
            reliability: reliability,
            description: description
        });
    }

    // 1. ID定位器 (最高优先级)
    if (info.id && info.id.trim()) {
        addLocator(
            `page.locator("#${info.id}")`,
            'ID选择器',
            '⭐⭐⭐⭐⭐',
            'ID是最可靠的定位方式'
        );
        addLocator(
            `page.getByTestId("${info.id}")`,
            'TestId选择器',
            '⭐⭐⭐⭐⭐',
            '假设ID用作测试标识'
        );
    }

    // 2. data-testid 专用定位器
    if (info.dataTestId && info.dataTestId.trim()) {
        addLocator(
            `page.getByTestId("${info.dataTestId}")`,
            'TestId选择器',
            '⭐⭐⭐⭐⭐',
            '专用测试标识，推荐使用'
        );
        addLocator(
            `page.locator("[data-testid='${info.dataTestId}']")`,
            'TestId属性选择器',
            '⭐⭐⭐⭐⭐'
        );
    }

    // 3. ARIA标签定位器
    if (info.ariaLabel && info.ariaLabel.trim()) {
        addLocator(
            `page.getByLabel("${info.ariaLabel}")`,
            'ARIA标签选择器',
            '⭐⭐⭐⭐',
            '无障碍标签，较为稳定'
        );
    }

    // 4. Role定位器
    if (info.role && info.role.trim()) {
        if (info.ariaLabel) {
            addLocator(
                `page.getByRole("${info.role}", new Page.GetByRoleOptions().setName("${info.ariaLabel}"))`,
                'Role+Name选择器',
                '⭐⭐⭐⭐',
                '结合角色和名称的定位'
            );
        } else {
            addLocator(
                `page.getByRole("${info.role}")`,
                'Role选择器',
                '⭐⭐⭐',
                '基于元素角色的定位'
            );
        }
    }

    // 5. Name属性定位器
    if (info.name && info.name.trim()) {
        addLocator(
            `page.locator("[name='${info.name}']")`,
            'Name属性选择器',
            '⭐⭐⭐⭐',
            '表单元素常用属性'
        );

        if (info.tagName === 'input' || info.tagName === 'textarea') {
            const inputType = info.type || 'textbox';
            if (inputType === 'submit' || inputType === 'button') {
                addLocator(
                    `page.getByRole("button", new Page.GetByRoleOptions().setName("${info.name}"))`,
                    'Button Role选择器',
                    '⭐⭐⭐⭐'
                );
            } else {
                addLocator(
                    `page.getByRole("textbox", new Page.GetByRoleOptions().setName("${info.name}"))`,
                    'Textbox Role选择器',
                    '⭐⭐⭐⭐'
                );
            }
        }
    }

    // 6. Placeholder定位器
    if (info.placeholder && info.placeholder.trim()) {
        addLocator(
            `page.getByPlaceholder("${info.placeholder}")`,
            'Placeholder选择器',
            '⭐⭐⭐⭐',
            '输入框占位符定位'
        );
        addLocator(
            `page.locator("[placeholder='${info.placeholder}']")`,
            'Placeholder属性选择器',
            '⭐⭐⭐⭐'
        );
    }

    // 7. 文本定位器
    if (info.textContent && info.textContent.trim() && info.textContent.length < 50) {
        const text = info.textContent.trim();

        // 精确文本匹配
        addLocator(
            `page.getByText("${text}")`,
            '精确文本选择器',
            '⭐⭐⭐',
            '精确匹配元素文本'
        );

        // 部分文本匹配
        if (text.length > 10) {
            const partialText = text.substring(0, 15);
            addLocator(
                `page.getByText("${partialText}", new Page.GetByTextOptions().setExact(false))`,
                '部分文本选择器',
                '⭐⭐',
                '部分匹配文本内容'
            );
        }

        // 传统text定位器
        addLocator(
            `page.locator("text=${text}")`,
            '文本定位器',
            '⭐⭐⭐',
            '传统文本定位方式'
        );
    }

    // 8. 链接定位器
    if (info.tagName === 'a' && info.href) {
        if (info.textContent && info.textContent.trim()) {
            addLocator(
                `page.getByRole("link", new Page.GetByRoleOptions().setName("${info.textContent.trim()}"))`,
                '链接文本选择器',
                '⭐⭐⭐⭐',
                '通过链接文本定位'
            );
        }
        addLocator(
            `page.locator("a[href='${info.href}']")`,
            '链接href选择器',
            '⭐⭐⭐',
            '通过链接地址定位'
        );
    }

    // 9. 图片定位器
    if (info.tagName === 'img') {
        if (info.alt && info.alt.trim()) {
            addLocator(
                `page.getByAltText("${info.alt}")`,
                '图片Alt文本选择器',
                '⭐⭐⭐⭐',
                '通过图片alt属性定位'
            );
        }
        if (info.src) {
            const srcName = info.src.split('/').pop();
            addLocator(
                `page.locator("img[src*='${srcName}']")`,
                '图片源文件选择器',
                '⭐⭐',
                '通过图片文件名定位'
            );
        }
    }

    // 10. 按钮定位器
    if (info.tagName === 'button' || info.type === 'submit' || info.type === 'button') {
        if (info.textContent && info.textContent.trim()) {
            addLocator(
                `page.getByRole("button", new Page.GetByRoleOptions().setName("${info.textContent.trim()}"))`,
                '按钮文本选择器',
                '⭐⭐⭐⭐',
                '通过按钮文本定位'
            );
        }
    }

    // 11. 类名定位器
    if (info.className && info.className.trim()) {
        const classes = info.className.split(' ').filter(c => c.trim());

        // 单个类名
        classes.slice(0, 3).forEach((cls, index) => {
            addLocator(
                `page.locator(".${cls}")`,
                `类选择器 ${index + 1}`,
                '⭐⭐',
                `通过类名 ${cls} 定位`
            );
        });

        // 组合类名
        if (classes.length > 1) {
            const combinedClasses = classes.slice(0, 2).join('.');
            addLocator(
                `page.locator(".${combinedClasses}")`,
                '组合类选择器',
                '⭐⭐⭐',
                '多个类名组合定位'
            );
        }
    }

    // 12. CSS组合选择器
    if (info.tagName) {
        if (info.id) {
            addLocator(
                `page.locator("${info.tagName}#${info.id}")`,
                'CSS组合选择器(标签+ID)',
                '⭐⭐⭐⭐⭐',
                '标签和ID的组合定位'
            );
        }
        if (info.name) {
            addLocator(
                `page.locator("${info.tagName}[name='${info.name}']")`,
                'CSS组合选择器(标签+Name)',
                '⭐⭐⭐⭐',
                '标签和name属性组合'
            );
        }
        if (info.type) {
            addLocator(
                `page.locator("${info.tagName}[type='${info.type}']")`,
                'CSS组合选择器(标签+Type)',
                '⭐⭐⭐',
                '标签和type属性组合'
            );
        }
    }

    // 13. 自定义CSS选择器
    if (info.cssSelector && info.cssSelector !== info.tagName) {
        addLocator(
            `page.locator("${info.cssSelector}")`,
            'CSS选择器',
            '⭐⭐⭐',
            '自动生成的CSS选择器'
        );
    }

    // 14. XPath选择器
    if (info.id) {
        addLocator(
            `page.locator("//${info.tagName}[@id='${info.id}']")`,
            'XPath(ID)',
            '⭐⭐⭐⭐',
            'XPath通过ID定位'
        );
    }

    if (info.name) {
        addLocator(
            `page.locator("//${info.tagName}[@name='${info.name}']")`,
            'XPath(Name)',
            '⭐⭐⭐⭐',
            'XPath通过name属性定位'
        );
    }

    if (info.textContent && info.textContent.trim() && info.textContent.length < 30) {
        const text = info.textContent.trim();
        addLocator(
            `page.locator("//${info.tagName}[contains(text(),'${text}')]")`,
            'XPath(包含文本)',
            '⭐⭐',
            'XPath通过包含文本定位'
        );
        addLocator(
            `page.locator("//${info.tagName}[text()='${text}']")`,
            'XPath(精确文本)',
            '⭐⭐⭐',
            'XPath通过精确文本定位'
        );
    }

    // 15. 自定义XPath
    if (info.xpath) {
        addLocator(
            `page.locator("${info.xpath}")`,
            '生成XPath',
            '⭐⭐',
            '自动生成的XPath'
        );
    }

    // 16. 位置相关定位器（作为备选）
    if (info.tagName) {
        addLocator(
            `page.locator("${info.tagName}").first()`,
            '首个标签选择器',
            '⭐',
            '选择页面第一个同类标签'
        );
        addLocator(
            `page.locator("${info.tagName}").last()`,
            '最后标签选择器',
            '⭐',
            '选择页面最后一个同类标签'
        );
    }

    // 按可靠性排序
    locators.sort((a, b) => {
        const reliabilityOrder = {
            '⭐⭐⭐⭐⭐': 5,
            '⭐⭐⭐⭐': 4,
            '⭐⭐⭐': 3,
            '⭐⭐': 2,
            '⭐': 1
        };
        return reliabilityOrder[b.reliability] - reliabilityOrder[a.reliability];
    });

    // 输出结果
    console.log('\\n' + '='.repeat(80));
    console.log('🎯 可用的定位器策略 (按推荐程度排序)');
    console.log('='.repeat(80));

    // 按可靠性分组显示
    const groups = {
        '⭐⭐⭐⭐⭐': '🏆 最高可靠性 (强烈推荐)',
        '⭐⭐⭐⭐': '✅ 高可靠性 (推荐)',
        '⭐⭐⭐': '👍 中等可靠性',
        '⭐⭐': '⚠️  较低可靠性',
        '⭐': '❌ 最低可靠性 (不推荐)'
    };

    Object.keys(groups).forEach(reliability => {
        const groupLocators = locators.filter(item => item.reliability === reliability);
        if (groupLocators.length > 0) {
            console.log('\\n' + groups[reliability]);
            console.log('-'.repeat(50));
            groupLocators.forEach((item, index) => {
                console.log(`${index + 1}. ${item.type}`);
                console.log(`   ${item.locator}`);
                if (item.description) {
                    console.log(`   💡 ${item.description}`);
                }
                console.log('');
            });
        }
    });

    console.log('='.repeat(80));
    console.log('📊 元素详细信息:');
    console.log(`   标签: ${info.tagName}`);
    console.log(`   ID: ${info.id || '无'}`);
    console.log(`   类名: ${info.className || '无'}`);
    console.log(`   文本: ${info.textContent || '无'}`);
    console.log(`   位置: (${Math.round(info.position.x)}, ${Math.round(info.position.y)})`);
    console.log(`   尺寸: ${Math.round(info.position.width)}x${Math.round(info.position.height)}`);
    console.log('='.repeat(80));
    console.log('💡 建议优先使用高可靠性的定位器');
    console.log('🔄 输入 startElementSelection() 继续选择元素');
    console.log('🛑 输入 stopElementSelection() 停止选择');
    console.log('='.repeat(80));

    return locators;
};
